#============================================
# #知识点
# 进程:资源单位
# 线程:执行单位

# 协程:这个概念完全是程序员自己意淫出来的根本不存在
# 单线程下实现并发
# 我们程序员自己再代码层面上检测我们所有的Io操作
# 一旦遇到Io了我们在代码级别完成切换
# 这样给CPU的感觉是你这个程序一直在运行没有IO
# 从而提升程序的运行效率

# 多道技术
# 切换+保存状态（保存用到yield,切换用到gevent中的spwan）
# CPU两种切换
# 1.程序遇到I0
# 2.程序长时间占用

# TCP服务端
# accept
# recv
#============================================
# gevent模块本:身无法检测常见的一些io操作
# 在使用的时候需要你额外的导入一句话
from gevent import monkey;monkey.patch_all()  #简介写法
from gevent import spawn
from time import sleep,time

def ha():
    print("哈")
    sleep(3)
    print("哈")


def heng():
    print("哼")
    sleep(2)
    print("哼")

stime = time()
g1 = spawn(heng)
g2 = spawn(ha)
g1.join()
g2.join()  #等待检测任务完毕后后执行
ztime = time() - stime 
print(ztime)
#============================================
# 协程实现tcp服务端并发
#服务端
# from gevent import monkey;monkey.patch_all()
# import socket
# from gevent import spawn
# def communication(conn):
#     while True:
#         try:
#             data = conn. recv( 1024)
#             if len(data) == 0: break
#             conn. send( data. upper() )
#         except ConnectionResetError as e:
#             print(e)
#             break
#     conn.close( )
# def server(ip, port) :
#     server = socket. socket( )
#     server.bind((ip, port))
#     server.listen(5 )
#     while True:
#         conn, addr = server.accept( )
#         spawn (communication,conn)
# if __name__ == "__main__":
#     g1 = spawn (server,'127.0.0.1',8080)
#     g1. join()
#
# #客户端
# from threading import Thread,current_thread
# def x_client():
#     client = socket. socket()
#     client . connect(( '127.0.0.1' ,8080) )
#     n=0
#     while True:
#         msg = '%s say hel1o %s'% (current_thread().name,n)
#         n+=1
#         client . send (msg . encode( 'utf-8'))
#         data = client. recv( 1024 )
#         print (data. decode( 'utf-8'))
#
# if __name__ == "__main__":
#     for i in range(500):
#         t = Thread(target=x_client)
#         t.start( )
#============================================
# 理想状态:
# 我们可以通过
# 多进程下面开设多线程
# 多线程下面再开设协程序
# 从而使我们的程序执行效率提升
#============================================
